//	COPYRIGHT (C) 1980 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

//APRIL 25, 1978
//BCPL-CONGEN, WRITTEN BY RAY CARHART.  THIS IS THE MAIN FILE FOR
//THE "GENERATE" SUBMODULE.  IN IT, GLOBAL VARIABLES ARE DECLARED,
//DATA IS INPUT AND THE CONSTRAINED GENERATOR, SGEN, IS CALLED.
GET "BCPLIB.GET[1,35]"
GET "MYLIB.GET[1,35]"
STATIC $( VECSPACE = VEC 8000; STACK = VEC 500; STACKPTR = 0 $);
LET DOSTUFF() BE
$( STATIC $( NTYPES=NIL; TYPENAME=NIL; TYPEVALENCE=NIL; ATTYPE=NIL;
             HMIN=NIL; NNODES=NIL; U = NIL; VSUM=NIL; GSTART=1; GSTOP=NIL;
             TYPENUM = NIL; PATSTART=NIL; PATSTOP=NIL; CTABLE=NIL;
             CTSTART=NIL; CTSTOP=NIL; HMAX = NIL; NUMHS = NIL;
             DOTS = NIL; MAPPEDTO = NIL; NLNODES = NIL; LMINS = NIL;
             LMAXS = NIL; LNODE= NIL; PTFLAG = NIL; AVOIDISTHMUS = NIL;
             TYPEISB = NIL; TYPEADDLISB = NIL; TYPEISBMIN = NIL;
             TYPEISBMAX = NIL; ARTYPE = NIL; NUMISBS = NIL $);
STATIC $( CTPTR = 1; NBR = NIL; ATI = NIL $);
MANIFEST $( P2WDSZ = 5; R2WDSZ = 32 $);
STATIC $( NSTRUCS = NIL; PATREC = NIL; OUTFILE = NIL $);
STATIC $( NUMPAT = NIL; PATRECS = NIL; PATMINS = NIL; PATMAXS = NIL;
          PATNNDS = NIL; NPATNODES = NIL; KEEPIT = NIL $);
STATIC $( PTRTOP = NIL $);
STATIC $( NATH = NIL; ATHSTART = NIL; ATTYPEH = NIL $);
STATIC $( NUMARPAT = NIL; ARPATNNDS = NIL; ARPATRECS = NIL; NARSTRUCS = NIL $);
STATIC $( STOPAFTER = NIL; STOPLAB = NIL $);
GET "SETFNS.BCL[1,35]"
GET "MAKPAT.BCL[1,35]"
GET "GMATCH.BCL[1,35]"
GET "ARPERC.BCL[1,35]"
GET "PATSIN.BCL[1,35]"
GET "ARPSIN.BCL[1,35]"
GET "GETISB.BCL[1,35]"
GET "RDCYCC.BCL[1,35]"
GET "CYCLES.BCL[1,35]"
GET "ESTRPT.BCL[1,35]"
GET "SGENC.BCL[1,35]"
GET "SEGFNS.BCL[1,35]"

RETPART:=0
IF FILEEXISTS(SC1FILENAME(),CGEXT) DO
 $( INPUT:=FINDFILE("DSK",SC1FILENAME(),CGEXT);
    READRETURN()
 $)
OUTSIF("NUMBER OF ATOM TYPES:"); NTYPES:=INNO();
TYPENAME:=NEWVEC(NTYPES); TYPEVALENCE:=NEWVEC(NTYPES);
TYPEISBMIN:=NEWVEC(NTYPES); TYPEISBMAX:=NEWVEC(NTYPES);
TYPEISB:=TYPEISBMIN; TYPEADDLISB:=NEWVEC(NTYPES);
TYPENAME!0:="**"; TYPENUM:=NEWVEC(NTYPES);
ATHSTART:=NEWVEC(NTYPES); NATH:=0;
OUTSIF("NAMES AND VALENCES:");
FOR I=1 TO NTYPES DO
 $(
 TYPENUM!I:=0;
 TYPENAME!I:=COPYS(INS());
 TYPEVALENCE!I:=INNO();
 ATHSTART!I:=NATH;
 NATH+:=TYPEVALENCE!I+1
 $);
OUTSIF("NUMBER OF ATOMS OF EACH TYPE:");
GSTOP:=0; VSUM:=0;
FOR I=1 TO NTYPES DO
 $(
 ATI:=INNO();
 TYPENUM!I:=ATI;
 GSTOP+:=ATI;
 VSUM+:=ATI*TYPEVALENCE!I
 $);
OUTSIF("NUMBER OF H'S:");
TYPENUM!0:=INNO();
OUTSIF("NUMBER OF PATTERNS:");NUMPAT:=INNO();
PATNNDS:=NEWVEC(NUMPAT);
IF NUMPAT>0 DO OUTSIF("NUMBER OF NODES FOR EACH PATTERN:"); NNODES:=0;
FOR I=1 TO NUMPAT DO $( PATNNDS!I:=INNO(); NNODES+:=PATNNDS!I $);
PATRECS:=NEWVEC(NUMPAT);
PATMINS:=NEWVEC(NUMPAT); PATMAXS:=NEWVEC(NUMPAT);
NNODES+:=GSTOP;
ATTYPEH:=NEWVEC(NNODES);
HMIN:=NEWVEC(NNODES); NUMHS:=HMIN; HMAX:=NEWVEC(NNODES-GSTOP)-GSTOP;
LMINS:=NEWVEC(NNODES-GSTOP)-GSTOP; LMAXS:=NEWVEC(NNODES-GSTOP)-GSTOP;
FOR I=GSTOP+1 TO NNODES DO $( LMINS!I:=0; LMAXS!I:=0 $);
ARTYPE:=NEWVEC(NNODES); FOR I=1 TO NNODES DO ARTYPE!I:=1;
OUTSIF("NUMBER OF AROMATIC PATTERNS:"); NUMARPAT:=INNO();
ARPATNNDS:=NEWVEC(NUMARPAT);
IF NUMARPAT>0 DO OUTSIF("NUMBER OF NODES FOR EACH AROMATIC PATTERN:");
FOR I=1 TO NUMARPAT DO $( ARPATNNDS!I:=INNO(); NNODES+:=ARPATNNDS!I $);
ARPATRECS:=NEWVEC(NUMARPAT); ARPATRECS!0:=NUMARPAT;
ATTYPE:=NEWVEC(NNODES);
CTSTART:=NEWVEC(NNODES);
CTSTOP:=NEWVEC(NNODES);
DOTS:=NEWVEC(NNODES);
MAPPEDTO:=NEWVEC(NNODES); FOR I=1 TO NNODES DO MAPPEDTO!I:=0;
CTPTR:=VSUM+1;
PATSTOP:=GSTOP;
CTABLE:=STACK;
READPATS();
READARPATS();
CTPTR-:=1;
GETISBRANGES("NUMBER OF ATOM TYPES FOR WHICH ISB RANGE IS TO BE SPECIFIED:",
             0,0);
FOR I=1 TO NTYPES DO TYPEADDLISB!I:=TYPEISBMAX!I-TYPEISBMIN!I;
READCYCCONSTR();
OUTSIF("SHALL I AVOID ISTHMUSES?(Y/N):");
AVOIDISTHMUS:=STREQUAL(INS(),"Y");
OUTSIF("STOPAFTER (NON-POSITIVE ENTRY MEANS GENERATE ALL STRUCTURES):");
STOPAFTER:=INNO();
UNLESS INPUT=TTY DO
 $(
 ENDREAD(INPUT);
 DELETEFILE(SC1FILENAME(),CGEXT);
 INPUT:=TTY
 $);

CTABLE:=NEWVEC(CTPTR);
BLT(STACK,CTABLE,CTABLE+CTPTR);

OUTFILE:=CREATEFILE("DSK",SC1FILENAME(),CGEXT);
OUTPUT:=OUTFILE;
OUTNOS(GSTOP);
U:=1-GSTOP+[VSUM-TYPENUM!0]/2;
OUTNOS(U);
FOR I=1 TO NTYPES DO
 FOR J=1 TO TYPENUM!I DO $( OUTS(TYPENAME!I); SPACES(1) $);
OUTPUT:=TTY;
NSTRUCS:=0;
NARSTRUCS:=0;
STOPLAB:=LABEL(WRAPUP);
SGEN(NTYPES,GSTOP,TYPEVALENCE,TYPENUM,TYPEISB,TYPEADDLISB,AVOIDISTHMUS);
WRAPUP:
OUTPUT:=OUTFILE;
OUTCH([127+48]REM 128);
ENDWRITE(OUTPUT);
OUTPUT:=CREATEFILE("DSK",SC2FILENAME(),CGEXT);
INPUT:=FINDFILE("DSK",TOPFILENAME(),CGEXT);
COPYSEGSTO(CHUNKSEP,SSHEADSTR,TRUE);
TEST NSTRUCS=STOPAFTER THEN $( OUTNOS(NSTRUCS); OUTS("PARTIAL*C*L") $)
OR OUTNOL(NSTRUCS);
OUTNOS(1); OUTNOL(NSTRUCS); OUTNOS(U);
FOR I=1 TO NTYPES DO
 IF [TYPENUM!I]>0 DO $( OUTS(TYPENAME!I); SPACES(1); OUTNOS(TYPENUM!I) $);
NEWLINE(1);
SKIPSEG(CHUNKSEP);
OUTCH(CHUNKSEP);
COPYTOEND();
ENDREAD(INPUT);
INPUT:=TTY;
ENDWRITE(OUTPUT);
OUTPUT:=TTY;
NEWLINE(1);
INTERRUPTABLE(FALSE);
FILEREPLACE(STRFILENAME(),CGEXT,SC1FILENAME(),CGEXT);
FILEREPLACE(TOPFILENAME(),CGEXT,SC2FILENAME(),CGEXT);
OUTNO(NSTRUCS); OUTS(" STRUCTURE");
OUTS((NSTRUCS NE 1 -> "S WERE"," WAS")); OUTS(" GENERATED*C*L");
IF NSTRUCS=STOPAFTER DO
 OUTS("!!!!! THIS IS ONLY A PARTIAL STRUCTURE LIST !!!!!*C*L");
IF NARSTRUCS>1 DO
 $(
 OUTS("I MIGHT HAVE PRODUCED MORE THAN ONE RESONANCE FORM FOR*C*L");
 OUTS("SOME OF THE AROMATIC STRUCTURES.  THESE STRUCTURES SHOULD BE*C*L");
 OUTS("'AROMATIZED' TO GUARANTEE FREEDOM FROM DUPLICATION.*C*L")
 $);
INTERRUPTABLE(TRUE);
TEST RETPART=0 THEN FINISH OR EXECUTERETURN()
$);
LET START() BE
 $(
 ![#124]:=TOPORSTOP; //SET REENTER ADDRESS (TOPS-10 STYLE)
 $[ $HRRZ 1,#44; //GET HIGHEST AVAILABLE LOWSEG ADDRESS
    $ADDI 1,#4000; //AND ADD AN ADDITIONAL 2K WORDS
    $CORE 1,0; //AND RESET CORE LIMIT
    $EXIT 1,0 //ERROR RETURN - RETURN TO MONITOR
 $];
 INITIALISEIO(VECSPACE,8000);
 OUTPUT:=TTY;
 INPUT:=TTY;
 RECINIT();
 DOSTUFF()
 $)
